tools/xl: show shutdown reason code, improve xl list heading
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 23 Nov 2010 19:36:14 +0000 (19:36 +0000)
committerIan Jackson <ian.jackson@eu.citrix.com>
Tue, 23 Nov 2010 19:36:14 +0000 (19:36 +0000)
Previously, xl list would not reveal the shutdown reason code unless
it was SHUTDOWN_crashed.  This is unfortunate; it makes it hard for
scripts which use xl to tell what's going on.

In this patch:

 * xl list shows the reason code as a single letter if it is
   any of the defined values from sched.h:
       -   poweroff or domain not shut down
       r   reboot
       s   suspend
       c   crashed
       w   watchdog
   This is not 100% backward-compatible with xm but I think it's a
   justifiable improvement.  It would be nice to make the same change
   to xm.

 * xl list -v shows the full numeric reason code in hex, or "-" if the
   domain is not shut down.

 * xl list -v has column headings for the UUID and numeric reason
   code.  The heading for the reason code overlaps with the UUID a bit.
   These headings are intended for human readers; scripts can parse
   the output by breaking on whitespace.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/xl_cmdimpl.c

index 5ff933bcb797ddff79b9b37b38b1732d7e67c9e9..555531922a7635767b24a0c99e0af676669143ba 100644 (file)
@@ -2484,11 +2484,16 @@ static void list_domains_details(const libxl_dominfo *info, int nb_domain)
 static void list_domains(int verbose, const libxl_dominfo *info, int nb_domain)
 {
     int i;
+    static const char shutdown_reason_letters[]= "-rscw";
 
-    printf("Name                                        ID   Mem VCPUs\tState\tTime(s)\n");
+    printf("Name                                        ID   Mem VCPUs\tState\tTime(s)");
+    if (verbose) printf("   UUID                            Reason-Code");
+    printf("\n");
     for (i = 0; i < nb_domain; i++) {
         char *domname;
+        unsigned shutdown_reason;
         domname = libxl_domid_to_name(&ctx, info[i].domid);
+        shutdown_reason = info[i].shutdown ? info[i].shutdown_reason : 0;
         printf("%-40s %5d %5lu %5d     %c%c%c%c%c%c  %8.1f",
                 domname,
                 info[i].domid,
@@ -2498,12 +2503,17 @@ static void list_domains(int verbose, const libxl_dominfo *info, int nb_domain)
                 info[i].blocked ? 'b' : '-',
                 info[i].paused ? 'p' : '-',
                 info[i].shutdown ? 's' : '-',
-                info[i].shutdown_reason == SHUTDOWN_crash ? 'c' : '-',
+                (shutdown_reason >= 0 &&
+                 shutdown_reason < sizeof(shutdown_reason_letters)-1
+                 ? shutdown_reason_letters[shutdown_reason] : '?'),
                 info[i].dying ? 'd' : '-',
                 ((float)info[i].cpu_time / 1e9));
         free(domname);
-        if (verbose)
+        if (verbose) {
             printf(" " LIBXL_UUID_FMT, LIBXL_UUID_BYTES(info[i].uuid));
+           if (info[i].shutdown) printf(" %8x", shutdown_reason);
+           else printf(" %8s", "-");
+       }
         putchar('\n');
     }
 }